﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Insifo.WE;
using System.Text.RegularExpressions;
using System.Collections.Specialized;

public partial class seg_segUsuarioPreferenciaListar : ObjectPage
{
    #region PROPIEDADES

    public Dictionary<string, bool> ListaSeleccion
    {
        set { ViewState["Seleccion"] = value; }
        get
        {
            if (ViewState["Seleccion"] == null)
                ViewState["Seleccion"] = new Dictionary<string, bool>();
            return (Dictionary<string, bool>)ViewState["Seleccion"];
        }
    }

    public string FilaSeleccionadaID
    {
        set { ViewState["FilaSeleccionadaID"] = value; }
        get
        {
            if (ViewState["FilaSeleccionadaID"] == null)
                ViewState["FilaSeleccionadaID"] = string.Empty;
            return ViewState["FilaSeleccionadaID"].ToString();
        }
    }

    #endregion

    #region EVENTOS

    protected void Page_Load(object sender, EventArgs e)
    {
        //Eventos del Master
        Master.MenuAccionEvento += new MasterPageMenuEditarClickHandler(Master_MenuButton);
        if (!IsPostBack)
        {
            Cargar();
        }
    }

    protected void Master_MenuButton(object sender, EventArgs e)
    {
        string strAccion = ((CommandEventArgs)e).CommandName;
        switch (strAccion)
        {
            case "Aceptar":
                Guardar("G");
                break;
            case "Aplicar":
                Guardar("A");
                break;
            case "Exportar":
                Exportar();
                break;
            case "Cancelar":
                Salir();
                break;
        }
    }

    protected void ddlAplicacion_SelectedIndexChanged(object sender, EventArgs e)
    {
        cargarParametro();
    }

    protected void lvUsuario_ItemCommand(object sender, ListViewCommandEventArgs e)
    {
        SeleccionarFila(e.CommandName);
        //Se guarda el id de la Aplicacion
        hfCodigoUsuario.Value = e.CommandArgument.ToString();
        //Muestra los usuarios de la aplicacion seleccionada
        MostrarUsuariosPorPreferencia();

    }

    protected void lvUsuario_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            HtmlTableRow htr = (HtmlTableRow)e.Item.FindControl("TrFila");
            ImageButton img = (ImageButton)e.Item.FindControl("ibtSeleccionar");
            img.CommandName = htr.UniqueID;
        }
    }

    protected void lvPreferencias_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            bool blnSeleccion = Convert.ToBoolean(DataBinder.Eval(e.Item.DataItem, "Seleccion"));
            string strKey = string.Format("{0}|{1}", DataBinder.Eval(e.Item.DataItem, "IdParametro").ToString(), DataBinder.Eval(e.Item.DataItem, "ParametroDetalle").ToString());
            CheckBox chkSeleccion = (CheckBox)e.Item.FindControl("chkSeleccion");
            if (ListaSeleccion.ContainsKey(strKey))
                chkSeleccion.Checked = ListaSeleccion[strKey];
            else
                chkSeleccion.Checked = blnSeleccion;

            if (blnSeleccion)
            {
                chkSeleccion.ForeColor = System.Drawing.ColorTranslator.FromHtml("#06CA06");
            }

            //if (DataBinder.Eval(e.Item.DataItem, "Estado").ToString().Equals(Constantes.ESTADO_INACTIVO))
            //{
            //    Label lblEstado = (Label)e.Item.FindControl("lblEstado");
            //    lblEstado.ForeColor = System.Drawing.ColorTranslator.FromHtml("#ff6230");
            //}
        }
    }

    protected void ibtBuscar_Click(object sender, ImageClickEventArgs e)
    {
        ListaSeleccion.Clear();
        MostrarListadoUsuarios();
    }

    protected void ibtBuscarPreferencia_Click(object sender, ImageClickEventArgs e)
    {
        EstablecerSeleccionLista();
        MostrarUsuariosPorPreferencia();
    }

    protected void ucpagLista_CambioPagina(object sender, EventArgs e)
    {
        ListarUsuarioListView();
    }

    protected void ucpagListaPreferencia_CambioPagina(object sender, EventArgs e)
    {
        ListarReportesListView();
    }

    #endregion

    #region METODOS

    protected void cargarParametro()
    {
        int intIdAplicacion = -1;
        int.TryParse(ddlAplicacion.SelectedValue, out intIdAplicacion);
        Util.loadComboAndItem(ddlParametro, ListarParametro(intIdAplicacion), "CodigoDescripcion", "IdParametro", string.Format("--{0}--", Resources.resDiccionario.Todos), "0");
    }

    /// <summary>
    /// Muestra el listado de Usuarios
    /// </summary>
    protected void MostrarListadoUsuarios()
    {
        ListaSeleccion.Clear();
        //Se establece los filtros de busqueda
        EstablecerFiltrosUsuario();
        //Se lista los usuarios de la aplicacion
        ListarUsuarioListView();
        //Ocultar el Listado de Menu
        MostrarPanelEnBlanco(true);
    }

    /// <summary>
    /// Muesta el listado de Preferencias por Usuario
    /// </summary>
    protected void MostrarUsuariosPorPreferencia()
    {
        ucpagListaPreferencia.NumeroPagina = 1;
        //Se establece los filtros de busqueda del Concepto
        EstablecerFiltrosPreferencia();
        //Se lista los Reportes
        ListarReportesListView();
        //Se muestra el formulario de Usuario
        MostrarPanelEnBlanco(false);
    }

    /// <summary>
    /// Se establece los filtros de la busqueda del usuario
    /// </summary>
    protected void EstablecerFiltrosUsuario()
    {
        ViewState["CodigoUsuario"] = txtCodigoUsuario.Text.Trim();
        ViewState["Nombre"] = txtDescripcionUsuario.Text.Trim();
        ViewState["Tipo"] = ddlTipoUsuario.SelectedValue;
        ViewState["Estado"] = ddlEstado.SelectedValue;
    }

    /// <summary>
    /// Se establece los filtros de la busqueda de los conceptos
    /// </summary>
    protected void EstablecerFiltrosPreferencia()
    {
        ViewState["Aplicacion"] = ddlAplicacion.SelectedValue.Trim();
        ViewState["Parametro"] = ddlParametro.SelectedValue.Trim();
    }

    /// <summary>
    /// Se guarda los usuarios seleccionado de la lista
    /// </summary>
    protected void EstablecerSeleccionLista()
    {
        bool blnSeleccion = false;
        string strKey = string.Empty;
        CheckBox chkSeleccion = null;
        for (int i = 0; i < lvPreferencias.Items.Count; i++)
        {
            strKey = string.Format("{0}|{1}", lvPreferencias.DataKeys[i]["IdParametro"].ToString(), lvPreferencias.DataKeys[i]["ParametroDetalle"].ToString());
            blnSeleccion = Convert.ToBoolean(lvPreferencias.DataKeys[i]["Seleccion"]);
            chkSeleccion = (CheckBox)lvPreferencias.Items[i].FindControl("chkSeleccion");
            if (chkSeleccion.Checked != blnSeleccion)
            {
                if (ListaSeleccion.ContainsKey(strKey))
                    ListaSeleccion[strKey] = chkSeleccion.Checked;
                else
                    ListaSeleccion.Add(strKey, chkSeleccion.Checked);
            }
            else
            {
                if (ListaSeleccion.ContainsKey(strKey))
                    ListaSeleccion.Remove(strKey);
            }
        }
    }

    /// <summary>
    /// Se oculta el listado de usuario por concepto
    /// </summary>
    /// <param name="blnMostrar">Ocultar Formulario de Usuario</param>
    protected void MostrarPanelEnBlanco(bool blnMostrar)
    {
        pnlFormulario.Style["display"] = blnMostrar ? "none" : "block";
        pnlSeleccioneParametroDetalle.Style["display"] = blnMostrar ? "block" : "none";
        lvPreferencias.Visible = !blnMostrar;
    }

    /// <summary>
    /// Listado de Reportes
    /// </summary>
    protected void ListarReportesListView()
    {
        int intIdAplicacion = 0;
        if (ViewState["Aplicacion"] != null)
            int.TryParse(ViewState["Aplicacion"].ToString(), out intIdAplicacion);
        int intIdParametro = 0;
        if (ViewState["Parametro"] != null)
            int.TryParse(ViewState["Parametro"].ToString(), out intIdParametro);
        string strCodigoUsuario = hfCodigoUsuario.Value;
        lvPreferencias.DataSource = ListarPreferenciaPorUsuario(intIdAplicacion, intIdParametro, strCodigoUsuario, ddlAsignado.SelectedValue, ddlEstadoPreferencia.SelectedValue, 0);
        lvPreferencias.DataBind();
        this.Master.MenuExportar.Visible = true;
    }

    /// <summary>
    /// Listado de Usuarios
    /// </summary>
    protected void ListarUsuarioListView()
    {
        int intTotalFilas = 0, intFilasXPagina = 0;
        string strCodigoUsuario = ViewState["CodigoUsuario"].ToString();
        string strNombre = ViewState["Nombre"].ToString();
        string strTipo = ViewState["Tipo"].ToString();
        string strEstado = ViewState["Estado"].ToString();

        DataTable dt = ListarUsuario(strCodigoUsuario, strNombre, strTipo, strEstado, ucpagLista.NumeroPagina);
        lvUsuario.DataSource = dt;
        lvUsuario.DataBind();
        if (dt.Rows.Count > 0)
        {
            intFilasXPagina = Convert.ToInt32(dt.Rows[0]["FilasXPagina"]);
            intTotalFilas = Convert.ToInt32(dt.Rows[0]["TotalFilas"]);
        }
        ucpagLista.TotalRegistros = intTotalFilas;
        ucpagLista.RegistrosPorPagina = intFilasXPagina;
        ucpagLista.EnlazarPaginador();
    }

    /// <summary>
    /// Marca la seleccion de la fila de Aplicativos
    /// </summary>
    /// <param name="pstrFilaId"></param>
    protected void SeleccionarFila(string pstrFilaId)
    {

        if (!string.IsNullOrEmpty(FilaSeleccionadaID))
        {
            Control ctrlPrevious = this.Form.FindControl(FilaSeleccionadaID);
            if (ctrlPrevious != null)
                ((HtmlControl)ctrlPrevious).Attributes["class"] = string.Empty;
        }
        ((HtmlControl)this.Form.FindControl(pstrFilaId)).Attributes["class"] = "lista-seleccion";
        FilaSeleccionadaID = pstrFilaId;
    }

    protected void Cargar()
    {
        this.Master.MenuSalir.Visible = false;
        Master.SubTitulo.Text = Resources.resDiccionario.Editar;
        string strAccion = Request.QueryString["a"];   //a: N-Nuevo, e-Editar, v-Ver
        string strId = Request.QueryString["i"];  //Id
        //Carga las Suites
        Util.loadComboAndItem(ddlAplicacion, ListarAplicaciones(), "Descripcion", "IdAplicacion", "Suit", string.Format("--{0}--", Resources.resDiccionario.Todos), "0");
        //Carga los Parametros
        cargarParametro();
        //Carga los Tipo de Usuario
        Util.loadComboAndItem(ddlTipoUsuario, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_TIPOUSUARIO), "Descripcion", "ParametroDetalle", string.Format("--{0}--", Resources.resDiccionario.Todos), "");
        Util.SelectCombo(ddlTipoUsuario, Constantes.TIPOUSUARIO_USUARIO);
        //Carga los Estado del Usuario
        Util.loadCombo(ddlEstado, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_ESTADOREGISTRO), "Descripcion", "ParametroDetalle");
        Util.loadCombo(ddlEstadoPreferencia, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_ESTADOREGISTRO), "Descripcion", "ParametroDetalle");
        List<ListItem> lstSeleccion = new List<ListItem>()
        {
            new ListItem(){ Text=string.Format("--{0}--",Resources.resDiccionario.Todos), Value=string.Empty},
            new ListItem(){ Text=Resources.resDiccionario.Asignado, Value="S"},
            new ListItem(){ Text=Resources.resDiccionario.NoAsignado, Value="N"},
        };
        //ddlSeleccionFuncion.Items.AddRange(lstSeleccion.ToArray());
        ddlAsignado.Items.AddRange(lstSeleccion.ToArray());
        Util.SelectCombo(ddlAsignado, "S");
        ucpagLista.NumeroPagina = 1;
        MostrarListadoUsuarios();
    }

    protected bool Validar(out WCUsuarioPreferencia.BEUsuario pbe)
    {
        string strCodigoUsuario = hfCodigoUsuario.Value;
        bool blnSeleccion = false;
        WCUsuarioPreferencia.BEUsuarioPreferencia beUsuarioPreferencia = null;
        CheckBox chkSeleccion = null;
        //Usuarios
        List<WCUsuarioPreferencia.BEUsuarioPreferencia> bePreferencias = new List<WCUsuarioPreferencia.BEUsuarioPreferencia>();
        for (int i = 0; i < lvPreferencias.Items.Count; i++)
        {
            blnSeleccion = Convert.ToBoolean(lvPreferencias.DataKeys[i]["Seleccion"]);
            chkSeleccion = (CheckBox)lvPreferencias.Items[i].FindControl("chkSeleccion");
            if (chkSeleccion.Checked != blnSeleccion)
            {
                beUsuarioPreferencia = new WCUsuarioPreferencia.BEUsuarioPreferencia();
                beUsuarioPreferencia.CodigoUsuario = strCodigoUsuario;
                beUsuarioPreferencia.IdParametro = Convert.ToInt32(lvPreferencias.DataKeys[i]["IdParametro"].ToString());
                beUsuarioPreferencia.ParametroDetalle = lvPreferencias.DataKeys[i]["ParametroDetalle"].ToString();
                beUsuarioPreferencia.Estado = chkSeleccion.Checked ? Constantes.ESTADO_ACTIVO : Constantes.ESTADO_INACTIVO;
                beUsuarioPreferencia.UsuarioCreacion = UsuarioSistema.CodigoUsuario;
                bePreferencias.Add(beUsuarioPreferencia);
            }
        }

        //Inicializa
        WCUsuarioPreferencia.BEUsuario be = new WCUsuarioPreferencia.BEUsuario
        {
            CodigoUsuario = strCodigoUsuario,
            Preferencias = bePreferencias.ToArray()
        };
        pbe = be;
        return true;
    }

    protected void Guardar(string pstrEvento) //G:Grabar, A:Aplicar
    {
        string strAccion = string.Empty;
        string strUsuario = string.Empty;
        strUsuario = UsuarioSistema.CodigoUsuario;
        WCUsuarioPreferencia.BEUsuario be;
        if (!Validar(out be)) //Valida e Inicializa
        {
            return;
        }

        be = InsertarUsuarioPreferencia(be);
        if (be.Error != 0)
           Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorRegistrar));

        if (pstrEvento == "G") //Si es GRABAR redirecciona a la Lista
        {
            if (be.Error == 0)
            {
                MostrarListadoUsuarios();
            }
        }
        else
        {
            //MostrarListadoUsuarios();
            //SeleccionarFila(FilaSeleccionadaID);
            MostrarUsuariosPorPreferencia();
        }

    }

    protected void Exportar()
    {
        UtilExcel ut = new UtilExcel();
        int intIdAplicacion = 0;
        if (ViewState["Aplicacion"] != null)
            int.TryParse(ViewState["Aplicacion"].ToString(), out intIdAplicacion);
        int intIdParametro = 0;
        if (ViewState["Parametro"] != null)
            int.TryParse(ViewState["Parametro"].ToString(), out intIdParametro);
        string strCodigoUsuario = hfCodigoUsuario.Value;
        DataTable dt = ListarPreferenciaPorUsuario(intIdAplicacion, intIdParametro, strCodigoUsuario, ddlAsignado.SelectedValue, ddlEstadoPreferencia.SelectedValue, ucpagListaPreferencia.NumeroPagina);
        
        dt.Columns.Remove("FilasXPagina");
        dt.Columns.Remove("TotalFilas");
        ut.ExportaAExcelHoja(dt, Resources.resDiccionario.Archivo, Resources.resDiccionario.Datos);
    }
   

    protected void Salir()
    {
        //Util.Redireciona(RUTA_LISTA, "?a=l", true);
    }

    #endregion

    #region LLAMDAS A WEBSERVICES

    /// <summary>
    /// Lista los Suit de la Aplicacion
    /// </summary>
    /// <returns></returns>
    protected DataTable ListarUsuario(string pstrCodigoUsuario, string pstrNombre, string pstrTipo, string pstrEstado, int pintPagina)
    {
        DataTable dt = new DataTable();
        WCUsuario.BEUsuario beUsuario = new WCUsuario.BEUsuario();
        beUsuario.CodigoUsuario = pstrCodigoUsuario;
        beUsuario.Nombre = pstrNombre;
        beUsuario.Tipo = pstrTipo;
        beUsuario.Estado = pstrEstado;
        beUsuario.Pagina = pintPagina;
        using (var client = new ServiceClient<WCUsuario.IWCUsuario>("BasicHttpBinding_IWCUsuario"))
        {
            var response = client.ServiceOperation<DataTable>(
                c => c.Listar(beUsuario).Tables[0]
                    );
            ;
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Método los usuarios del concepto
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCUsuarioPreferencia.BEUsuario InsertarUsuarioPreferencia(WCUsuarioPreferencia.BEUsuario pbe)
    {
        WCUsuarioPreferencia.BEUsuario be = new WCUsuarioPreferencia.BEUsuario();
        using (var client = new ServiceClient<WCUsuarioPreferencia.IWCUsuarioPreferencia>("BasicHttpBinding_IWCUsuarioPreferencia"))
        {
            var response = client.ServiceOperation<WCUsuarioPreferencia.BEUsuario>( c => c.Insertar(pbe));
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Lista de Parametro Detalle
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarPreferenciaPorUsuario(int pintIdAplicacion, int pintIdParametro, string pstrCodigoUsuario, string pstrAsignado, string pstrEstado, int pinPagina)
    {
        WCUsuarioPreferencia.BEUsuarioPreferencia be = new WCUsuarioPreferencia.BEUsuarioPreferencia();
        be.IdAplicacion = pintIdAplicacion;
        be.IdParametro = pintIdParametro;
        be.CodigoUsuario = pstrCodigoUsuario;
        be.Estado = pstrAsignado;
        be.Asignado = pstrAsignado;
        be.Pagina = pinPagina;

        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCUsuarioPreferencia.IWCUsuarioPreferencia>("BasicHttpBinding_IWCUsuarioPreferencia"))
        {
            var response = client.ServiceOperation<DataTable>(c => c.Listar(be).Tables[0]);
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Lista los Suit de la Aplicacion
    /// </summary>
    /// <returns></returns>
    protected DataTable ListarAplicaciones()
    {
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCAplicacion.IWCAplicacion>("BasicHttpBinding_IWCAplicacion"))
        {
            var response = client.ServiceOperation<DataTable>(c => c.Listar().Tables[0] );
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Lista de los Parametros de la Aplicacion
    /// </summary>
    /// <returns></returns>
    protected DataTable ListarParametro(int pintIdAplicacion)
    {
        WCParametro.BEParametro be = new WCParametro.BEParametro();
        be.IdAplicacion = pintIdAplicacion;
        be.Descripcion = string.Empty;
        be.Tipo = "R";
        be.Estado = Constantes.ESTADO_ACTIVO;

        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCParametro.IWCParametro>("BasicHttpBinding_IWCParametro"))
        {
            var response = client.ServiceOperation<DataTable>(
                c => c.Listar_Sel(be).Tables[0]
                    );
            ;
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Método Lista Companias
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarParametroDetalle(int pintidCompania, int pintIdAplicacion, string pstrParametro)
    {
        WCParametroDetalle.BEParametroDetalle be = new WCParametroDetalle.BEParametroDetalle();
        be.IdCompania = pintidCompania;
        be.IdAplicacion = pintIdAplicacion;
        be.Parametro = pstrParametro;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCParametroDetalle.IWCParametroDetalle>("BasicHttpBinding_IWCParametroDetalle"))
        {
            var response = client.ServiceOperation<DataTable>(c => c.Listar(be).Tables[0]);
            dt = response;
        }
        return dt;
    }
    #endregion

}